/**
 * 推送器接口
 * 用于将热键信息推送给客户端或其他系统
 */
class IPusher {
  /**
   * 推送热键
   * @param {Object} hotKeyModel - 热键模型
   */
  push(hotKeyModel) {
    throw new Error('Method not implemented');
  }
  
  /**
   * 推送删除热键
   * @param {Object} hotKeyModel - 热键模型
   */
  remove(hotKeyModel) {
    throw new Error('Method not implemented');
  }
}

/**
 * 控制台推送器实现
 * 用于测试，将热键信息输出到控制台
 */
class ConsolePusher extends IPusher {
  /**
   * 推送热键
   * @param {Object} hotKeyModel - 热键模型
   */
  push(hotKeyModel) {
    console.log(`[控制台推送器] 发现热键: ${JSON.stringify(hotKeyModel)}`);
  }
  
  /**
   * 推送删除热键
   * @param {Object} hotKeyModel - 热键模型
   */
  remove(hotKeyModel) {
    console.log(`[控制台推送器] 删除热键: ${JSON.stringify(hotKeyModel)}`);
  }
}

/**
 * 长连接推送器实现
 * 通过TCP长连接将热键信息推送给客户端
 */
class TcpPusher extends IPusher {
  /**
   * 构造函数
   * @param {ClientConnManager} clientManager - 客户端连接管理器
   */
  constructor(clientManager) {
    super();
    this.clientManager = clientManager;
  }
  
  /**
   * 推送热键
   * @param {Object} hotKeyModel - 热键模型
   */
  push(hotKeyModel) {
    if (!this.clientManager) {
      console.error('[TCP推送器] 客户端连接管理器未初始化');
      return;
    }
    
    // 获取应用名称，推送到对应的应用组
    const appName = hotKeyModel.appName;
    if (appName) {
      console.log(`[TCP推送器] 推送热键到应用 ${appName}: ${hotKeyModel.key}`);
      this.clientManager.pushToApp(appName, hotKeyModel);
    } else {
      console.log(`[TCP推送器] 推送热键到所有客户端: ${hotKeyModel.key}`);
      this.clientManager.pushToAll(hotKeyModel);
    }
  }
  
  /**
   * 推送删除热键
   * @param {Object} hotKeyModel - 热键模型
   */
  remove(hotKeyModel) {
    if (!this.clientManager) {
      console.error('[TCP推送器] 客户端连接管理器未初始化');
      return;
    }
    
    // 获取应用名称，推送到对应的应用组
    const appName = hotKeyModel.appName;
    if (appName) {
      console.log(`[TCP推送器] 推送删除热键到应用 ${appName}: ${hotKeyModel.key}`);
      this.clientManager.removeFromApp(appName, hotKeyModel);
    } else {
      console.log(`[TCP推送器] 推送删除热键到所有客户端: ${hotKeyModel.key}`);
      // 遍历所有应用，发送删除消息
      for (const appName of this.clientManager.appGroups.keys()) {
        this.clientManager.removeFromApp(appName, hotKeyModel);
      }
    }
  }
}

module.exports = {
  IPusher,
  ConsolePusher,
  TcpPusher
};
